﻿using System;
using Csla.Serialization;
using Csla.Core;
using Csla;
using System.Collections.Generic;
using Sireass.Dal;
using System.ComponentModel.DataAnnotations;
using log4net;

namespace Sireass.Bl
{
    [Serializable]
    public class ProyectoEdit : BusinessBase<ProyectoEdit>
    {
        #region Propiedades
        // Create a logger for use in this class
        private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        public static readonly PropertyInfo<long> IdProyectoProperty = RegisterProperty<long>(c => c.IdProyecto);
        [Display(Name = "Id del proyecto")]
        public long IdProyecto
        {
            get { return GetProperty(IdProyectoProperty); }
            private set { LoadProperty(IdProyectoProperty, value); }
        }

		public static readonly PropertyInfo<long> IdProgramaProperty = RegisterProperty<long>(c => c.IdPrograma);
		[Display(Name = "Id Programa")]
		public long IdPrograma
		{
			get { return GetProperty(IdProgramaProperty); }
			set { SetProperty(IdProgramaProperty, value); }
		}

		public static readonly PropertyInfo<string> ProgramaProperty = RegisterProperty<string>(c => c.Programa);
		[Display(Name = "Descripción Programa")]
		public string Programa
		{
			get { return GetProperty(ProgramaProperty); }
			set { SetProperty(ProgramaProperty, value); }
		}

        public static readonly PropertyInfo<long> IdUnidadResponsableProperty = RegisterProperty<long>(c => c.IdUnidadResponsable);
        [Display(Name = "Id Unidad Responsable")]
        public long IdUnidadResponsable
        {
            get { return GetProperty(IdUnidadResponsableProperty); }
            set { SetProperty(IdUnidadResponsableProperty, value); }
        }

        public static readonly PropertyInfo<string> UnidadResponsableProperty = RegisterProperty<string>(c => c.UnidadResponsable);
        [Display(Name = "Descripción Unidad Responsable")]
        public string UnidadResponsable
        {
            get { return GetProperty(UnidadResponsableProperty); }
            set { SetProperty(UnidadResponsableProperty, value); }
        }

        public static readonly PropertyInfo<long> IdResponsableProperty = RegisterProperty<long>(c => c.IdResponsable);
        [Display(Name = "Id Responsable")]
        public long IdResponsable
        {
            get { return GetProperty(IdResponsableProperty); }
            set { SetProperty(IdResponsableProperty, value); }
        }

        public static readonly PropertyInfo<string> ResponsableProperty = RegisterProperty<string>(c => c.Responsable);
        [Display(Name = "Descripción Responsable")]
        public string Responsable
        {
            get { return GetProperty(ResponsableProperty); }
            set { SetProperty(ResponsableProperty, value); }
        }

        public static readonly PropertyInfo<string> ProyectoProperty = RegisterProperty<string>(c => c.Proyecto);
        [Display(Name = "Proyecto")]
        public string Proyecto
        {
            get { return GetProperty(ProyectoProperty); }
            set { SetProperty(ProyectoProperty, value); }
        }

        public static readonly PropertyInfo<string> ClaveProyectoProperty = RegisterProperty<string>(c => c.ClaveProyecto);
        [Display(Name = "Clave del Proyecto")]
        public string ClaveProyecto
        {
            get { return GetProperty(ClaveProyectoProperty); }
            set { SetProperty(ClaveProyectoProperty, value); }
        }

        public static readonly PropertyInfo<string> ObjetivoProyectoProperty = RegisterProperty<string>(c => c.Objetivo);
        [Display(Name = "Objetivo del Proyecto")]
        public string Objetivo
        {
            get { return GetProperty(ObjetivoProyectoProperty); }
            set { SetProperty(ObjetivoProyectoProperty, value); }
        }

        public static readonly PropertyInfo<string> MetaProperty = RegisterProperty<string>(c => c.Meta);
        [Display(Name = "Meta")]
        public string Meta
        {
            get { return GetProperty(MetaProperty); }
            set { SetProperty(MetaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaInicioVigenciaProperty = RegisterProperty<DateTime>(c => c.FechaInicioVigencia);
        [Display(Name = "Fecha Inicio Vigencia")]
        public DateTime FechaInicioVigencia
        {
            get { return GetProperty(FechaInicioVigenciaProperty); }
            set { SetProperty(FechaInicioVigenciaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaFinVigenciaProperty = RegisterProperty<DateTime>(c => c.FechaFinVigencia);
        [Display(Name = "Fecha Fin Vigencia")]
        public DateTime FechaFinVigencia
        {
            get { return GetProperty(FechaFinVigenciaProperty); }
            set { SetProperty(FechaFinVigenciaProperty, value); }
        }

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            set { SetProperty(HabilitadoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        [Display(Name = "Fecha Alta")]
        public DateTime FechaAlta
        {
            get { return GetProperty(FechaAltaProperty); }
            set { SetProperty(FechaAltaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            set { SetProperty(FechaBajaProperty, value); }
        }
        #endregion

        #region Factory

        private ProyectoEdit() { }

        public static void NewProyectoEdit(EventHandler<DataPortalResult<ProyectoEdit>> callback)
        {
            DataPortal.BeginCreate<ProyectoEdit>(callback);
        }

        public static ProyectoEdit NewProyectoEdit()
        {
            return DataPortal.Create<ProyectoEdit>();
        }

        public static void GetProyectoEdit(long id, EventHandler<DataPortalResult<ProyectoEdit>> callback)
        {
            DataPortal.BeginFetch<ProyectoEdit>(id, callback);
        }

        public static ProyectoEdit GetProyectoEdit(long id)
        {
            return DataPortal.Fetch<ProyectoEdit>(id);
        }

        public static void DeleteProyectoEdit(long id)
        {
            if (log.IsDebugEnabled)
            {
                log.Debug("DeleteProyectoEdit->id: " + id);
            }
            DataPortal.Delete<ProyectoEdit>(id);
        }


        #endregion

        #region Métodos
        public static void AddObjectAuthorizationRules()
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
            PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
            List<string> roles = new List<string>(perfilesPorServicio.Count);
            foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
            {
                roles.Add(perfilServicio.Perfil);
            }
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.DeleteObject, roles));
        }
        #endregion

        #region Data Portal

        [RunLocal]
        protected override void DataPortal_Create()
        {
            using (BypassPropertyChecks)
            {
                IdProyecto = -1;
            }
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(long id)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoDal>();
                using (var data = new Csla.Data.SafeDataReader(dal.Fetch(id)))
                {
                    data.Read();
                    using (BypassPropertyChecks)
                    {						
                        IdProyecto = data.GetInt64("nId_Proyecto");
						IdPrograma = data.GetInt64("nId_Programa");
						Programa = data.GetString("cPrograma");
                        IdUnidadResponsable = data.GetInt64("nId_UnidadResponsable");
                        UnidadResponsable = data.GetString("cUnidadResponsable");
                        IdResponsable = data.GetInt64("nId_Persona_Responsable");
                        Responsable = data.GetString("cResponsable");
                        Proyecto = data.GetString("cProyecto");
                        ClaveProyecto = data.GetString("cClave_Proyecto");
                        Objetivo = data.GetString("cObjetivo");
                        Meta = data.GetString("cMeta");
                        FechaInicioVigencia = data.GetDateTime("dFecha_Inicio_Vigencia");
                        FechaFinVigencia = data.GetDateTime("dFecha_Fin_Vigencia");
                        Habilitado = data.GetBoolean("bHabilitado");
                        FechaAlta = data.GetDateTime("dFecha_Alta");
                        FechaBaja = data.GetDateTime("dFecha_Baja");

                    }
                }
            }
            BusinessRules.CheckRules();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoDal>();
                using (BypassPropertyChecks)
                {
                    IdProyecto = dal.Insert(IdPrograma, IdUnidadResponsable, IdResponsable, Proyecto, ClaveProyecto,
                            Objetivo, Meta, FechaInicioVigencia, FechaFinVigencia, Habilitado);
                }
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoDal>();
                using (BypassPropertyChecks)
                {
                    dal.Update(IdProyecto, IdPrograma, IdUnidadResponsable, IdResponsable, Proyecto, ClaveProyecto,
                            Objetivo, Meta, FechaInicioVigencia, FechaFinVigencia, Habilitado);
                }
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            using (BypassPropertyChecks)
            {
                DataPortal_Delete(IdProyecto);
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(long id)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoDal>();
                dal.Delete(id);
            }
        }

        protected override void DataPortal_OnDataPortalInvoke(DataPortalEventArgs e)
        {
            // implement your behavior here
            base.DataPortal_OnDataPortalInvoke(e);
        }

        protected override void DataPortal_OnDataPortalInvokeComplete(DataPortalEventArgs e)
        {
            // implement your behavior here
            base.DataPortal_OnDataPortalInvokeComplete(e);
        }

        protected override void Child_OnDataPortalException(DataPortalEventArgs e, Exception ex)
        {
            // implement your behavior here
            base.Child_OnDataPortalException(e, ex);
        }
        #endregion

    }
}
